package com.rc.web.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.rc.common.constant.Code;
import com.rc.common.constant.CollectType;
import com.rc.common.exception.BusinessException;
import com.rc.pojo.dto.collect.AddCollectDTO;
import com.rc.pojo.po.Collect;
import com.rc.pojo.vo.collect.CollectVO;
import com.rc.web.converter.CollectConverter;
import com.rc.web.mapper.CollectMapper;
import com.rc.web.service.ActivityService;
import com.rc.web.service.AdoptionService;
import com.rc.web.service.CollectService;
import com.rc.web.service.FarmService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 收藏服务实现类
 * 提供用户收藏相关的业务逻辑实现
 */
@Service
@RequiredArgsConstructor
public class CollectServiceImpl extends ServiceImpl<CollectMapper, Collect> implements CollectService {
    // 收藏转换器
    private final CollectConverter collectConverter;
    // 农场服务
    private final FarmService farmService;
    // 活动服务
    private final ActivityService activityService;
    // 领养服务
    private final AdoptionService adoptionService;

    /**
     * 判断是否已收藏
     * @param mapId 收藏项ID
     * @param type 收藏类型
     * @return 是否已收藏
     */
    @Override
    public Boolean isCollect(Long mapId, Integer type) {
        var loginId = StpUtil.getLoginId(-1L);
        return mapper.isCollect(mapId,type,loginId);
    }

    /**
     * 获取收藏列表
     * @param type 收藏类型
     * @return 收藏VO列表
     */
    @Override
    public List<CollectVO> getList(Integer type) {
        var collects = mapper.selectByConId(StpUtil.getLoginId(-1L),type);
        return collects.stream()
                .map(collectConverter::toVO)
                .toList();
    }

    /**
     * 根据收藏项ID和类型删除收藏
     * @param itemId 收藏项ID
     * @param type 收藏类型
     */
    @Override
    public void deleteOneByItemIdAndType(Long itemId, Integer type) {
        mapper.deleteByItemIdAndType(itemId,type);
    }

    /**
     * 添加收藏
     * @param dto 收藏添加DTO
     */
    @Override
    public void add(AddCollectDTO dto) {
        var type = dto.getType();
        var itemId = dto.getItemId();

        // 检查是否已收藏
        var isCollect = this.isCollect(itemId, type);
        if (isCollect){
            throw new BusinessException(Code.IS_COLLECT);
        }

        // 根据类型转换收藏对象
        var collect = switch (type){
            case CollectType.FARM -> collectConverter.farm2PO(farmService.getById(itemId));
            case CollectType.ACTIVITY -> collectConverter.activity2PO(activityService.getById(itemId));
            case CollectType.ADOPTION -> collectConverter.adoption2PO(adoptionService.getById(itemId));
            default -> throw new IllegalStateException("Unexpected value: " + type);
        };

        // 检查收藏对象是否存在
        if (collect == null){
            throw new BusinessException(Code.NO_SUCH_COLLECT);
        }

        // 保存收藏
        this.save(collect);
    }

    /**
     * 根据收藏项ID和类型更新收藏
     * @param collect 收藏对象
     */
    @Override
    public void updateByItemIdAndType(Collect collect) {
        mapper.updateByItemIdAndType(collect);
    }
}
